import time
import context

const short_duration = 2 * time.millisecond // a reasonable duration to block in an example

// This example passes a context with an arbitrary deadline to tell a blocking
// function that it should abandon its work as soon as it gets to it.
fn main() {
    dur := time.now().add(short_duration)
    mut background := context.background()
    mut ctx, cancel := context.with_deadline(mut &background, dur)

    defer {
        // Even though ctx will be expired, it is good practice to call its
        // cancellation function in any case. Failure to do so may keep the
        // context and its parent alive longer than necessary.
        cancel()
        time.sleep(short_duration) // give a small time window, in which the go thread routine has a chance to return
        eprintln('> defer block finishes')
    }

    ctx_ch := ctx.done()
    select {
        _ := <-ctx_ch {
            println('>> read from ctx_ch succeeded')
        }
        1 * time.second {
            panic('This should not happen')
        }
    }
    eprintln('> main finishes')
}
